package jdx_07_DCL;

public class Mgr06 {
    private static Mgr06 INSTANCE;

    private Mgr06(){}//不让别人通过构造器访问

    public static Mgr06 getInstance(){
        /*
        业务逻辑(可以在这块写)...
         */
        if(INSTANCE==null){
            synchronized (Mgr06.class){
                if(INSTANCE==null){//【实验6】对照【实验5】，这里再次加入一个判断，那么【实验4】的情况就不会再有了
                    INSTANCE = new Mgr06();
                }
            }
        }
        return INSTANCE;
    }
}

/*
【实验5】
1)当线程1来访问if的时候，发现是空对象，立马拿到锁，开始执行锁块中的代码，当实例还没有初始化的时候
2)线程2这时候也来访问if了，发现也是空的，于是就直接等待拿锁，因为这时候锁被线程1征用了
3)当线程1执行完锁块中的代码，此时对象才被实例化，线程1释放锁后
4)线程2拿到锁，进入锁块，又把对象初始化了一遍

【实验6】
4)线程2拿到锁，进入锁块，发现还有一个if，此时由于对象已经被线程1初始化过了，所以if条件不成立，就不会再往下走了，直接拿到唯一的对象

 */

